package model;
import java.time.LocalDate;
@SuppressWarnings("serial")
public class SavingAccount extends Account {
private String name;
private double money;
private double gain;
private LocalDate gainDate, currentDate;
private boolean isRunning = true;
private static int MINIMUM_SUM_TO_WITHDRAW = 1000;
public SavingAccount(double money, double gain, int year, int month, int day) {
super(money, "Account: ");
this.money = super.getMoney();
this.name = super.getName();
this.gain = gain;
gainDate = LocalDate.of(year, month, day);
currentDate = LocalDate.now();
addingGain();
}
@Override
public double getMoney() {
return this.money;
}
public void addingGain() {
new Thread(new Runnable() {
public void run() {
while (isRunning) {
currentDate = LocalDate.now();
if (currentDate.getYear() > gainDate.getYear()
|| currentDate.getYear() == gainDate.getYear()
&& currentDate.getMonthValue() > gainDate.getMonthValue()
|| currentDate.getYear() == gainDate.getYear()
&& currentDate.getMonthValue() == gainDate.getMonthValue()
&& currentDate.getDayOfYear() > gainDate.getDayOfYear()) {
isRunning = false;
}
if (currentDate.equals(gainDate)) {
synchronized (this) {
double gainSum = money * gain / 100;
money += gainSum;
setChanged();
notifyObservers();
isRunning = false;
}
}
try {
Thread.sleep(86400000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
@Override
public void setMoney(double money) {
this.money = money;
setChanged();
notifyObservers();
}
@Override
public String getName() {
return this.name;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
long temp;
temp = Double.doubleToLongBits(money);
result = prime * result + (int) (temp ^ (temp >>> 32));
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
SavingAccount other = (SavingAccount) obj;
if (Double.doubleToLongBits(money) != Double.doubleToLongBits(other.money))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
public static int getMinimumSumToWithdraw() {
return MINIMUM_SUM_TO_WITHDRAW;
}
@Override
public String toString() {
return String.format(name + " " + money + " " + gain + " " + gainDate);
}
}